unit MainFrm;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, 
  Controls, Forms, Dialogs,StdCtrls, Mask;

type
  {Khai bao kieu ban ghi}
  TPersonRec = packed record
        FirstName: String[20];
        LastName: String[20];
        Sex: String[1];
        BirthDay: TDateTime;
        Age: Integer;
  end;

  TOpenKind=(fOpen,fCreate);
  
TDataRecSet=class

     procedure SetDataFile(Filename:string);
     procedure Open(option:TOpenKind);
     procedure Close;

     function  GetCurrentRec:TPersonRec;

     function  GetRecSize:Longint;
     function  GetRecNo:Longint;
     function  GetRecCount:Longint;

     procedure WriteRec(Rec:TPersonRec);
     procedure AppendRec(Rec:TPersonRec);

     procedure First;
     procedure Last;
     procedure Next;
     procedure Previous;

    private
     FFile        :file of TPersonRec;
     FFileName:String;
     FRecPos    :Integer;
  end;

  TMainForm = class(TForm)
    lbRecNo: TLabel;

    edFirstName: TEdit;
    edLastname: TEdit;
    edSex: TEdit;
    edAge: TEdit;
    meBirthday: TMaskEdit;

    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;

    buttFirst: TButton;
    buttPrev: TButton;
    buttNext: TButton;
    buttLast: TButton;

    buttAppend: TButton;
    buttUpdate: TButton;
    buttClear: TButton;

    procedure buttFirstClick(Sender: TObject);
    procedure buttPrevClick(Sender: TObject);
    procedure buttNextClick(Sender: TObject);
    procedure buttLastClick(Sender: TObject);

    procedure buttAppendClick(Sender: TObject);
    procedure buttUpdateClick(Sender: TObject);
    procedure buttClearClick(Sender: TObject);

    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; 
                                             var Action: TCloseAction);
  private
    Table:TDataRecSet;

    { Private declarations }
  public

    procedure ShowCurrentRecord;
    procedure ClearFields;

    { Public declarations }
  end;


var
  MainForm: TMainForm;

implementation

{$R *.DFM}

procedure TDataRecSet.SetDataFile(Filename: string);
begin
  FFileName:=Filename;
end;

{M hoac tao tap tin mi}
procedure TDataRecSet.Open(option:TOpenKind);
begin
  AssignFile(FFile,FFileName);
  case option of
   fOpen  :Reset(FFile);
   fCreate:Rewrite(FFile);
  end;
end;

procedure TDataRecSet.Close;
begin
   CloseFile(FFile);
end;

procedure TDataRecSet.AppendRec(Rec: TPersonRec);
begin
  Seek(FFile,FileSize(FFile));
  write(FFile,Rec);
end;

procedure TDataRecSet.WriteRec(Rec: TPersonRec);
begin
  Seek(FFile,FRecPos);
  Write(FFile,Rec);
end;

function TDataRecSet.GetCurrentRec: TPersonRec;
begin
   read(FFile,result);
end;

function TDataRecSet.GetRecCount: Longint;
begin
  result:=FileSize(FFile);
end;

function TDataRecSet.GetRecNo: Longint;
begin
   result:=FRecPos;
end;

function TDataRecSet.GetRecSize: Longint;
begin
  result:=sizeof(TPersonRec);
end;

procedure TDataRecSet.First;
begin
   FRecPos:=0;
   Seek(FFile,FRecPos);
end;

procedure TDataRecSet.Previous;
begin
   if FRecPos>0 then Dec(FRecPos);
   Seek(FFile,FRecPos);
end;

procedure TDataRecSet.Next;
begin
   inc(FRecPos);
   if (FRecPos>=GetRecCount) then Dec(FRecPos);
   Seek(FFile,FRecPos);
end;

procedure TDataRecSet.Last;
begin
   FRecPos:=FileSize(FFile);
   if FRecPos>0 then Dec(FRecPos);
   Seek(FFile,FRecPos);
end;


procedure TMainForm.FormCreate(Sender: TObject);
begin
 Table:=TDataRecSet.Create;
 Table.SetDataFile('C:\Persons.dat');

 if not FileExists('C:\Persons.dat') then
     Table.Open(fCreate)
 else
     Table.Open(fOpen);

 ClearFields;

 if Table.GetRecCount>0 then begin
    Table.First;
    ShowCurrentRecord;
 end;

end;

procedure TMainForm.FormClose(Sender: TObject; 
                                                          var Action: TCloseAction);
begin
 Table.Close;
end;

procedure TMainForm.ShowCurrentRecord;
begin
  if table.GetRecCount=0 then begin
     ShowMessage('No record in file! Please append first');
     exit;
  end;

  with table.GetCurrentRec do begin
     edFirstName.Text:=FirstName;
     edLastName.Text:=LastName;
     edSex.Text:=Sex;
     edAge.Text:=IntToStr(Age);
     meBirthday.Text:=DateToStr(Birthday);

     lbRecNo.caption:='Record No :'
                                       +intToStr(Table.GetRecNo+1)
                                       +'/'+intToStr(Table.GetRecCount);
  end;
end;

procedure TMainForm.ClearFields;
begin
    edFirstName.Text:='';
    edLastName.Text:='';
    edSex.Text:='';
    edAge.Text:='';
    meBirthday.Text:='';
end;

procedure TMainForm.buttAppendClick(Sender: TObject);
var p:TPersonRec;
begin

 p.FirstName:='';
 p.LastName:='';
 p.Sex:='';
 p.BirthDay:=0;
 p.Age:=0;
 table.AppendRec(p);

 table.Last;
 ShowCurrentRecord;

end;

procedure TMainForm.buttUpdateClick(Sender: TObject);
var p:TPersonRec;
begin
 p.FirstName:=edFirstName.Text;
 p.LastName:=edLastName.Text;
 p.Sex:=edSex.Text;
 p.BirthDay:=StrToDate(meBirthday.Text);
 p.Age:=StrToInt(edAge.Text);

 Table.WriteRec(p);

 ShowMessage('Data updated');
end;

procedure TMainForm.buttClearClick(Sender: TObject);
begin
 clearFields;
end;

procedure TMainForm.buttFirstClick(Sender: TObject);
begin
  Table.First;
  ShowCurrentRecord;
end;

procedure TMainForm.buttPrevClick(Sender: TObject);
begin
  Table.Previous;
  ShowCurrentRecord;
end;

procedure TMainForm.buttNextClick(Sender: TObject);
begin
  Table.Next;
  ShowCurrentRecord;
end;

procedure TMainForm.buttLastClick(Sender: TObject);
begin
  Table.Last;
  ShowCurrentRecord;
end;


end.
